/*
 * 版权所有 (C) 2022 中国南方航空股份有限公司。
 * 本文件可能包含有南方航空公司的机密或专有信息。
 * 未经许可不得擅自公开、复制这些机密资料及其中任何部分，
 * 只可按照其使用许可协议，在南方航空公司内部使用。
 *
 * File Name: $(#)TestConcurrent.java
 * Creation Date: 2022年3月4日 上午10:15:36
 * $Id$
 */
package com.andy.note.main.concurrent.cyclicbarrier;

import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * <p>
 * 测试并发
 * </p>
 *
 * @author zhouguoan 908119428@qq.com
 * @version $Revision: 1.1 $ $Date: 2022年3月4日 上午10:15:36 $
 */
public class TestConcurrent {

    public static void main(String[] args) {
        Integer count = 4; // 并发数量，最好以cpu核心数
        CyclicBarrier cb = new CyclicBarrier(count); // 栅栏

        ExecutorService pool = Executors.newFixedThreadPool(count);
        // i 要多少次测试并发； 条件必须是并发数量的倍数，否则最后需要手动停止
        for (int i = 0; i < 8; i++) {
            pool.execute(new TestBody(cb));
        }
        pool.shutdown();

        // 还没全部跑完就等待3秒，直到全部结束
        while (!pool.isTerminated()) {
            try {
                Thread.sleep(3000);
            } catch (Exception e) {
                System.out.println(e);
            }
        }
    }
}

/**
 * 执行内容
 * <p>
 * DOCUMENTME <code>com.andy.note.main.concurrent.cyclicbarrier.TestBody</code>类的说明
 * </p>
 *
 * @author zhouguoan 908119428@qq.com
 * @version $Revision: 1.1 $ $Date: 2022年3月4日 上午10:26:43 $
 */
class TestBody implements Runnable {
    private CyclicBarrier cb;

    public TestBody(CyclicBarrier cb) {
        this.cb = cb;
    }

    @Override
    public void run() {
        try {
            // 等待所有的任务，实现并发
            cb.await();
            // 要做的内容
            System.err.println("hello world " + Thread.currentThread().getName());

        } catch (Exception e) {
            System.out.println(e);
        }
    }
}